/**///////////////////////////////////////////////////////////////////////
// Text.cpp: implementation of the CText class.
//
/**///////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Text.h"


//--------------------------------------------------------------------
//Macro define
#define DEFAULT_BKMODE            TRANSPARENT
#define DEFAULT_TEXT_COLOR        RGB(0,0,0)
#define DEFAULT_BK_COLOR        RGB(255,255,255)
#define DEFAULT_FORMAT            (DT_LEFT | DT_SINGLELINE)
#define DEFAULT_POINT_SIZE        0
#define DEFAULT_WEIGHT            0


#define MAX_WEIGHT                1000
#define MIN_WEIGHT                0
//--------------------------------------------------------------------
/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////

CText::CText()
{
	memset(&m_rcWndPos,0,sizeof(m_rcWndPos));
	m_pszText = NULL;
	m_ulSizeText = 0;
	m_iBkMode = DEFAULT_BKMODE;
	m_crTextColor = DEFAULT_TEXT_COLOR;
	m_crBkColor = DEFAULT_BK_COLOR;
	m_uFormat = DEFAULT_FORMAT;
	m_iPointSize = DEFAULT_POINT_SIZE;
	m_iWeight = 0;
	m_bItalic = FALSE;
	m_bUnderline = FALSE;
	m_bStrikeOut = FALSE;
}

CText::~CText()
{
	if(m_pszText != NULL)
	{
			delete [] m_pszText;
			m_pszText = NULL;
	}
}

//--------------------------------------------------------------------
//Description:
//    Set the control position
//
//--------------------------------------------------------------------
void CText::SetPosition(const RECT *prc)
{
	m_rcWndPos = *prc;
}


//--------------------------------------------------------------------
//Description:
//    Set the text. If you want to display the text ,you should call the Display()
//
//--------------------------------------------------------------------
BOOL CText::SetText(const TCHAR *pszText)
{
	ULONG ulLen = _tcslen(pszText);

	if(m_pszText == NULL)
		{        
			m_pszText = new TCHAR [ulLen + 1];

			if(m_pszText == NULL)
				{
					return FALSE;
			}

			m_ulSizeText = ulLen + 1;
	}
	else if(ulLen + 1 > m_ulSizeText)
		{
			delete [] m_pszText;

			m_pszText = new TCHAR [ulLen + 1];

			if(m_pszText == NULL)
				{
					return FALSE;
			}

			m_ulSizeText = ulLen + 1;
	}

	_tcscpy(m_pszText,pszText);

	return TRUE;
}


//--------------------------------------------------------------------
//Description:
//    Display the text stored.
//
//--------------------------------------------------------------------
void CText::Draw(HDC hdc)
{
	COLORREF crOldTextColor = ::SetTextColor(hdc,m_crTextColor);
	COLORREF crOldBkColor = ::SetBkColor(hdc,m_crBkColor);
	int iOldMode = ::SetBkMode(hdc,m_iBkMode);


	LOGFONT lf = {0};
	HFONT hFontNew, hFontOld;
	lf.lfQuality = CLEARTYPE_QUALITY;
	lf.lfCharSet = DEFAULT_CHARSET;
	lf.lfHeight = -1 * (m_iPointSize * GetDeviceCaps(hdc,LOGPIXELSY) / 72); 
	lf.lfItalic = m_bItalic;
	lf.lfUnderline = m_bUnderline;
	lf.lfStrikeOut = m_bStrikeOut;

	hFontNew = CreateFontIndirect(&lf);
	hFontOld = (HFONT) SelectObject(hdc, hFontNew);


	DrawText(hdc,m_pszText,-1,&m_rcWndPos,m_uFormat);


	SelectObject(hdc, hFontOld);
	DeleteObject(hFontNew);

	::SetTextColor(hdc,crOldTextColor);
	::SetBkColor(hdc,crOldBkColor);
	::SetBkMode(hdc,iOldMode);
}


//--------------------------------------------------------------------
//Description:
//    Set the background mode.
//
//Parameters:
//    iMode: [in] The value is just like as follow:
//        OPAQUE      -- Background is filled with the current background color before the text, 
//                        hatched brush, or pen is drawn. 
//        TRANSPARENT -- Background remains untouched. 

//--------------------------------------------------------------------
BOOL CText::SetBkMode(int iMode)
{
	if(iMode == OPAQUE || iMode == TRANSPARENT)
		{
			m_iBkMode = iMode;
			return TRUE;
	}
	else
		{
			return FALSE;
	}
}


//--------------------------------------------------------------------
//Description:
//    Set the text color
//
//--------------------------------------------------------------------
void CText::SetTextColor(COLORREF crColor)
{
	m_crTextColor = crColor;
}


//--------------------------------------------------------------------
//Description:
//    Set the background color
//
//--------------------------------------------------------------------
void CText::SetBkColor(COLORREF crColor)
{
	m_crBkColor = crColor;
}

//--------------------------------------------------------------------
//Description:
//    Set Format.
//
//Parameters:
//    The value you should see the uFormat of DrawText()
//--------------------------------------------------------------------
void CText::SetFormat(UINT uFormat)
{
	m_uFormat = uFormat;
}


//--------------------------------------------------------------------
//Description:
//    Set the point size of text
//
//---------------------------------------------------------------------
void CText::SetPointSize(int iPointSize)
{
	m_iPointSize = iPointSize;
}


//--------------------------------------------------------------------
//Description:
//    Get the position as rect
//
//---------------------------------------------------------------------
void CText::GetPosition(RECT *prcOut)
{
	*prcOut = m_rcWndPos;
}


//--------------------------------------------------------------------
//Description:
//    Specifies the weight of the font in the range 0 through 1000. For example, 
//400 is normal and 700 is bold. If this value is zero, a default weight is used. 
//
//---------------------------------------------------------------------
BOOL CText::SetWeight(int iWeight)
{
	if(iWeight < MIN_WEIGHT || iWeight > MAX_WEIGHT)
		{
			return FALSE;
	}

	m_iWeight = iWeight;

	return TRUE;
}



//--------------------------------------------------------------------
//Description:
//    Set the italic
//
//---------------------------------------------------------------------
void CText::SetItalic(BOOL bItalic)
{
	m_bItalic = bItalic;
}



//--------------------------------------------------------------------
//Description:
//    Set the underline
//
//---------------------------------------------------------------------
void CText::SetUnderline(BOOL bUnderline)
{
	m_bUnderline = bUnderline;
}


//--------------------------------------------------------------------
//Description:
//    Set the strikeOut
//
//---------------------------------------------------------------------
void CText::SetStrikeOut(BOOL bStrikeOut)
{
	m_bStrikeOut = bStrikeOut;
}

//--------------------------------------------------------------------
//Description:
//    Overload the operator "="
//
//---------------------------------------------------------------------
CText& CText::operator =(const CText &rhs)
{
	if(this == &rhs)
		{
			return *this;
	}

	this->m_bItalic = rhs.m_bItalic;
	this->m_bStrikeOut = rhs.m_bStrikeOut;
	this->m_bUnderline = rhs.m_bUnderline;
	this->m_crBkColor = rhs.m_crBkColor;
	this->m_crTextColor = rhs.m_crTextColor;
	this->m_iBkMode = rhs.m_iBkMode;
	this->m_iPointSize = rhs.m_iPointSize;
	this->m_iWeight = rhs.m_iWeight;
	this->m_rcWndPos = rhs.m_rcWndPos;
	this->m_uFormat = rhs.m_uFormat;
	this->m_ulSizeText = rhs.m_ulSizeText;

	if(this->m_pszText != NULL)
		{
			delete [] this->m_pszText;
	}
	this->m_pszText = new TCHAR[_tcslen(rhs.m_pszText) + 1];
	_tcscpy(this->m_pszText,rhs.m_pszText);


	return *this;
}
